<?php

	//prosty wrapper do tabeli bazy danych

	//DSN - adres do polaczen z baza danych
	//przyklad  : mysql://root:test@127.0.0.1:3307/gorilla3
	//skladnia  : dbms://login:haslo@ip:port/bazadanych
	//opcje dbms: mysql, pgsql


    class CTable
    {
		var $m_bTransactionOpen;	//czy tranzakcja zaostala otwarta

		var $m_szDsn;				//dsn do bazy danych		
				
		static function &GetInstance()
		{
			global $g_hObjects;
						
			$hApp = new CTable();
				
			$g_hObjects[] = &$hApp;

			$hApp->OnInit();

			return $hApp;
		}
		
		function OnInit()
		{
			$this->m_bTransactionOpen = false;
			
			//ustawiamy defaultowy DSN do bazy z /etc/config.php
			$this->m_szDsn = DSN;
		}
		
		function OnDestroy()
		{
			$this->m_bTransactionOpen = false;
		}
		
		function SetDSN($szDsn)
		{
			$this->m_szDsn = $szDsn;
		}

		//otwiera tranzakcje
		function BeginTransaction()
		{
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query("begin work");
			
			$this->m_bTransactionOpen = true;
		}
		
		//konczy tranzakcje i zapisuje wyniki
		function CommitTransaction()
		{
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query('commit work');
			
			$this->m_bTransactionOpen = false;
		}
		
		//rollback
		function RollbackTransaction()
		{
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query('rollback work');
			
			$this->m_bTransactionOpen = false;
		}
		
		//rollback to savepoint
		function RollbackTo($szSavePoint)
		{
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query('savepoint '.$szSavePoint);
		}
		
		function SavePoint($szName)
		{
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query('savepoint '.$szName);
		}
		
		//wykonuje kwerende
		function &Query($szSql,$iCacheTtl = 0)
		{
			if($iCacheTtl == 0)
			{
				$hDbms = CDbms::GetInstance();
				$hDbms->ConnectDsn($this->m_szDsn);
				$hDbms->Query($szSql);
				
				$szOutput = array();
				
				while($hTemp = $hDbms->GetResultAsRow())
				{
					$szOutput[] = $hTemp;
				}
				
				return  $szOutput;
			}
			
			
			$hCacheMngr = CCache::GetInstance();
			$hCacheMngr->UseHash(true);
			
			$szOutput = $hCacheMngr->Get('/sql',$szSql,$iCacheTtl);
			
			if($szOutput == false)
			{
				$hDbms = CDbms::GetInstance();
				$hDbms->ConnectDsn($this->m_szDsn);
				$hDbms->Query($szSql);
				
				$szOutput = array();
				
				while($hTemp = $hDbms->GetResultAsRow())
				{
					$szOutput[] = $hTemp;
				}
				
				$hCacheMngr->Set('/sql',$szSql,$szOutput,$iCacheTtl);
				
				return  $szOutput;
								 
			}
			else
			{
				return $szOutput;
			}

		}
		
		//execute a pl/pgsql procedure
		function &ExecProc($szProcName,$aParams = array(),$aGetWhat = array(),$szOptions = '')
		{
			$szParam = '';
		
			foreach($aParams as &$szKey)
			{
			$szParam .= "'".trim($szKey)."',";
			}
			
			$szParam = trim($szParam,',');
			
			
			if($aGetWhat == array() )
			{
				$szSql = 'select '.$szProcName.'('.$szParam.') as out';
				
				//connecting to dbms
				$hDbms = CDbms::GetInstance();
				$hDbms->ConnectDsn($this->m_szDsn);
				
				$hDbms->Query($szSql);
				$aResult = $hDbms->GetResultAsRow();
				
				//result is single row
				return $aResult['out'];
			}
			else
			{
				//what would like you to get from the procedure
				$szGetWhat = '';
				
				foreach($aGetWhat as &$szKey)
				{
					$szGetWhat .= trim($szKey).',';
				}	
				
				$szGetWhat = trim($szGetWhat,',');
				
				
				if($szOptions == '')
				{
					$szSql = 'select '.$szGetWhat.' from '.$szProcName.'('.$szParam.')';
				}
				else
				{
					$szSql = 'select '.$szGetWhat.' from '.$szProcName.'('.$szParam.') '.$szOptions;
				}
				
				//connecting to dbms
				$hDbms = CDbms::GetInstance();
				$hDbms->ConnectDsn($this->m_szDsn);
				
				$hDbms->Query($szSql);
				
				$aOutput = array();
				
				//gathering procedure output
				while($hTemp = $hDbms->GetResultAsRow())
				{
					$aOutput[] = $hTemp;
				}
				
				
				return  $aOutput;
			}
		}
		
		
		//wklada dane do tabeli
		//$szTableName - nazwa tabeli
		//$szSet       - zbior danych - jaki lancuch badz tablica asocjacyjna
		function Put($szTableName,$szSet)
		{
			if(is_string($szSet))
			{	
				$aSet 	= explode(",",$szSet);
				$szArgs	= "";
				$szVals	= "";
				
				var_dump($aSet);
				
				foreach($aSet as &$hTemp)
				{
					list($szArg,$szVal) = @explode("=",$hTemp);
				
					if($szArg == "" || $szVal == '')
					continue;
				
					$szArgs .= trim($szArg).',';
					$szVals .= "'".trim($szVal)."',";
				}
				
				$szArgs = trim($szArgs,',');
				$szVals = trim($szVals,',');
				
				
				$szSql = "insert into ".$szTableName."(".$szArgs.") values (".$szVals.")";
				
				//var_dump($szSql);
				//die();
				
				$hDbms = CDbms::GetInstance();
				$hDbms->ConnectDsn($this->m_szDsn);
				$hDbms->Query($szSql);
				
				return;
			}
			
			if(is_array($szSet))
			{
				$szArgs = "";
				$szVals = "";
						
				foreach($szSet as $szArg => &$szVal)
				{
					if($szArg == "" || $szVal == '') { continue; }
				
					$szArgs .= trim($szArg).',';
					$szVals .= "'".$szVal."',";
				}
				
				$szArgs = trim($szArgs,',');
				$szVals = trim($szVals,',');
				
				$szSql = "insert into ".$szTableName."(".$szArgs.") values (".$szVals.")";
				
				/*/debugging
				echo '<pre>';
				print_r($szSql);
				echo '</pre>';
				die();
				//*/
				
				$hDbms = CDbms::GetInstance();
				$hDbms->ConnectDsn($this->m_szDsn);
				$hDbms->Query($szSql);
			}
		}
		
		//pobiera tablice wierszy spelinajacych zadane warunki
		// $aTables - nazwy tabeli
		// $aFields - pola jakie maja byc zwrocone
		// $aWhere  - warunki (w przypadku ich braku zapodac array() )
		// $szOptions - opcje order by, group by itd. (w przypadku braku zapodac '')
		function &GetArray($aTables = array(),$aFields = array(),$aWhere = array(), $szOptions = '' )
		{
			//dealing with tables
			$szTables = '';
			
			foreach($aTables as &$szKey)
			{
				$szTables .= trim($szKey).',';
			}
			
			$szTables = trim($szTables,',');
			
			//dealing with fields
			$szFields = '';
			
			foreach($aFields as &$szKey)
			{
				$szFields .= trim($szKey).',';
			}
			
			$szFields = trim($szFields,',');
			
			//dealing with where
			$szWhere = '';
			
			foreach($aWhere as &$szKey)
			{
				$szWhere .= trim($szKey).' ' ;
			}
			
			$szWhere = trim($szWhere,',');
			
			///////////////////////////////////////////////
			//laczymy sql'a
			///////////////////////////////////////////////
			
			$szSql = 'select '.$szFields.' from '.$szTables.' ';
			
			if($szWhere)
			{
				$szSql .= 'where '.$szWhere.' ';
			}
			
			if($szOptions)
			{
				$szSql .= $szOptions.' ';
			}
			
			/*/debugging
			echo '<pre style="color: #0f0;">';
			print_r($szSql);
			echo '</pre>';
			//*/
			
			//laczymy sie z baza i wykonujemy zapytanie 
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query($szSql);
			
			$szOutput = array();
			
			while($hTemp = $hDbms->GetResultAsRow())
			{	
				$szOutput[] = $hTemp;
			}
			
			return $szOutput;
		}
		
		//tablice wierszy spelnajacych zadane warunki
		//
		// $aTables - nazwy tabeli
		// $aFields - pola jakie maja byc zwrocone
		// $aJoin   - typy i warunki joinow
		// $aWhere  - warunki (w przypadku ich braku zapodac array() )
		// $szOptions - opcje order by, group by itd. (w przypadku braku zapodac '')
		//
		//
		// jak podawac join'a?
		// $aJoin[] = array('type' => 'left outer','table' => 'a','on' => 'a.klient_id = b.klient_id')
		
		function GetArrayJoin($aTables = array(),$aFields = array(),$aJoins = array(),$aWhere = array(), $szOptions = '')
		{
			//przetwarzamy nazwy tabel
			$szTables = '';
			
			foreach($aTables as &$szKey)
			{
				$szTables .= trim($szKey).',';
			}
			
			$szTables = trim($szTables,',');
			
			//przetwarzamy nazwy pol
			$szFields = '';
			
			foreach($aFields as &$szKey)
			{
				$szFields .= trim($szKey).',';
			}
			
			$szFields = trim($szFields,',');
			
			//przetwarzamy join'a
			$szJoin = '';
			
			foreach($aJoins as &$aJoin)
			{
				$szJoin .= $aJoin['type'].' join ';
				$szJoin .= $aJoin['table'].' ';
				$szJoin .= ' on ';
				$szJoin .= $aJoin['on'].' ';
			}
			
			//przetwarzamy where
			$szWhere = '';
			
			foreach($aWhere as &$szKey)
			{
				$szWhere .= trim($szKey).' ' ;
			}
			
			$szWhere = trim($szWhere,',');
			
			
			///////////////////////////////////////////////
			//laczymy sql'a
			//////////////////////////////////////////////
			$szSql = 'select '.$szFields.' from '.$szTables.' '.$szJoin.' ';
			
			if($szWhere)
			{
				$szSql .= 'where '.$szWhere.' ';
			}
			
			if($szOptions)
			{
				$szSql .= $szOptions.' ';
			}
			
			/*/debugging
			echo '<pre style="color: #0f0;">';
			print_r($szSql);
			echo '</pre>';
			//*/
			
			//zasysamy dane z bazy
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query($szSql);
			
			$szOutput = array();
			
			while($hTemp = $hDbms->GetResultAsRow())
			{
				$szOutput[] = $hTemp;
			}
			
			return $szOutput;
		}
		
		
		// zwraca pojedynczy wiersz
		// $szTable   - nazwa tabeli
		// $szFields  - pola jako ciag tekstowy
		// $aWhere    - warunki zapytania jako tablica lub ciag tekstowy
		// $szOptions - opcje do zapytania (jesli brak to zapodac '')
		
		function &GetRow($szTable,$szFields,$aWhere,$szOptions = '')
		{	    
			if( is_array($aWhere) )
			{
				$szWhere = '';
				
				foreach($aWhere as &$szKey)
				{
					$szWhere .= trim($szKey).' ' ;
				}
				
				$szWhere = trim($szWhere,',');    
				
				$szSql = 'select '.$szFields.' from '.$szTable.' where '.$szWhere.' '.$szOptions.' limit 1'; 
			}
			else
			{
				$szWhere = &$aWhere;
			
				$szSql = 'select '.$szFields.' from '.$szTable.' where '.$szWhere.' '.$szOptions.' limit 1'; 
			}
			
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query($szSql);
			
			$aOut = $hDbms->GetResultAsRow();
			
			if(!$aOut) { $aOut = array(); }
			
			if($aOut)
			{
				foreach($aOut as $szKey => &$szVal)
				{
					if($szVal)
					{
						$szVal = stripslashes($szVal);
						$szVal = stripcslashes($szVal);
					}
				}
			}
			else
			{
				$aOut = array();
			}
			
			return $aOut;
		}
				
		//aktualizacja wpisow
		function Update($szTableName,$hSet,$szWhere)
		{
			if(is_array($hSet))
			{
				$szSet = '';
					 
				foreach($hSet as $szArg => &$szVal)
				{
				
					if($szArg == "")
							 continue;

							 
					if( is_int($szVal) && $szVal == 0)
					{
						$szSet .= $szArg." = 0,";
					}
					else if($szVal == 'null' || $szVal == 'NULL' || $szVal == '')
					{
						$szSet .= $szArg." = null,";
					}
					elseif(substr($szVal,0,3) == '{|-' && substr($szVal,(strlen($szVal)-3)) == '-|}')
					{					
					$szVal = substr($szVal, 3, (strlen($szVal) - 6));
					$szSet .= $szArg." = ".$szVal.",";
					}
					else
					{
					$szSet .= $szArg." = '".$szVal."',";
					}
				}
				
				$szSet = trim($szSet,',');
								
				$szSql = "update ".$szTableName." set ".$szSet." where ".$szWhere;
			}
			else
			{
				$szSet    = trim($hSet);
				$szWhere  = trim($szWhere);
				
				$szSql = "update ".$szTableName." set ".$szSet." where ".$szWhere;
			}
			
			/*/debugging
			echo '<pre>';
			print_r($szSql);
			echo '</pre>';
			die();
			//*/
			
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			
			$hDbms->Query($szSql);
		}
		
		//kasuje odpowiednie wpisy, jesli nie podanow warkunu - czysci cala tabele
		function Delete($szTableName,$szWhere = "")
		{
			$szWhere = trim($szWhere);
			
			if($szWhere != "")
			{
				$szSql = "delete from ".$szTableName." where ".$szWhere;
			}
			else
			{
				$szSql = "delete from ".$szTableName;
			}
			
			/*/debugging
			echo '<pre>';
			print_r($szSql);
			echo '</pre>';
			//*/			
			
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			
			$hDbms->Query($szSql);
		}
		
		function GetForShare($szTableName,$szWhere,$bNoWait = false)
		{
			$szSql = 'select 1 from '.$szTableName.' where '.$szWhere.' for share ';
			
			if($bNoWait)
			{
				$szSql.='nowait';
			}
			
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			
			$hDbms->Query($szSql);
		}
		
		//blokuje wiersze do aktualizacji
		function GetForUpdate($szTableName,$szWhere,$bNoWait = false)
		{
			$szSql = 'select 1 from '.$szTableName.' where '.$szWhere.' for update ';
			
			if($bNoWait)
			{
				$szSql.='nowait';
			}
			
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			
			$hDbms->Query($szSql);
		}
		
	
		//pobiera liste tabel w serwisie
    	function &GetTables()
		{
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			
			$szSql = 'show tables';
			$hDbms->Query($szSql);
			
			
			$aOut = array();
			
			while($aTmp = $hDbms->GetResultAsRow())
			{
				$aOut[] = $aTmp[key($aTmp)];
			}
			
			return $aOut;
		}
		
		//pobiera liste tabel i pol w serwisie
		function GetTablesAndFields()
		{
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			
			$szSql = 'show tables';
			$hDbms->Query($szSql);
			
			
			$aOut = array();
			
			while($aTmp = $hDbms->GetResultAsRow())
			{
				$aOut[] = array('table' => $aTmp[key($aTmp)], 'fields' => array() );
			}
			
			foreach($aOut as &$aTmpA)
			{
				$szSql = 'show fields in '.$aTmpA['table'];
				$hDbms->Query($szSql);
								
				while($aTmpB = $hDbms->GetResultAsRow())
				{
					$aTmpA['fields'][] = $aTmpB['Field'];
				}
			}
			
			return $aOut;
		}

    	//pobiera liste kolumn w tabeli
		function GetColumnsFromTable( &$szTable ) {
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			
			$szSql = 'show columns from '.$szTable;
			$hDbms->Query($szSql);
			
			$aOut = array();
			
			while($aTmp = $hDbms->GetResultAsRow())
			{
				$aOut[] = $aTmp;
			}
			
			return $aOut;
		}

		//tworzy nowa tabele
		//$szTabName - nazwa tabeli
		//$aFields - opis poszczegolnych pol, ktore posiadaja wartosci dla kluczy:
		//	$aField['name'] - nazwa atrybutu (obowiazkowo: string)
		//	$aField['type'] - typ atrybutu (obowiazkowo: string)
		//	$aField['not_null'] - ustawienie ograniczenia integralnosciowego not_null (nieobowiazkowe: true | false)
		//  $aField['default'] - ustawienie domyslnej wartosci (nieobowiazkowe: string)
		//  $aField['auto_increment'] - automatyczne zwiekszanie (nieobowiazkowe: true | false)
		//	$aField['unique'] - wartosc unikalna (nieobowiazkowe: true | false)
		//  $aField['comment'] - ustawia komentarz do atrybutu (nieobowiazkowe: string)
		//	$aField['primary_key'] - ustawienie klucza podstawowego (nieobowiazkowe: true | false)
		//$aTabOptions - opcje tabeli (wszystkie opcjonalne), ktore posiadaja wartosci dla kluczy:
		//	$aTabOpt['engine'] - nazwa silnika (string)
		//	$aTabOpt['auto_increment'] - wartosc auto_increment (int)
		//	$aTabOpt['default_character'] - domyslne kodowanie (string, domyslnie: utf8)
		//	$aTabOpt['default_collate'] - (string, domyslnie: utf8_general_ci)
		//	$aTabOpt['comment'] - komentarz (string)
    	function Create($szTabName, $aFields)
		{
			$szSql = 'create table '.$szTabName.' (';
			
			foreach($aFields as &$aField) {
				if ( isset($aField['name']) && isset($aField['type']) ) {
					/*
					if( strncmp($aField['type'],"money",4) == 0 ) {
		     			$aField['type'] = 'float';
		     		}
					*/
		     	
		     		$szSql .= $aField['name'].' '.$aField['type'].' ';
					
					if ( isset($aField['not_null']) && $aField['not_null'] == true) {
						$szSql .= ' NOT NULL ';
					}
					
					if ( isset($aField['default']) && !empty($aField['default']) ) {
						$szSql .= ' DEFAULT '.$aField['defualt'].' ';
					}
					
					if ( isset($aField['auto_increment']) && $aField['auto_increment'] == true ) {
						$szSql .= ' AUTO_INCREMENT ';
					}
					
					if ( isset($aField['unique']) && $aField['unique'] == true ) {
						$szSql .= ' UNIQUE ';
					}
					
					if ( isset($aField['comment']) && !empty($aField['comment']) ) {
						$szSql .= ' COMMENT '.$aField['comment'].' ';
					}
					
					if ( isset($aField['primary_key']) && $aField['primary_key'] == true ) {
						$szSql .= ' PRIMARY KEY ';
					}
					
					$szSql .= ', ';
				}
			}
			
			$szSql = rtrim($szSql, ', ');
			$szSql .= ')';
			
			//laczy sie z baza i wykonuje zapytanie 
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query($szSql);
		}
		
		//uaktualnia tabele - dzialanie podobne do CTable::Create()
		//$szTabName - nazwa tabeli
		//$aFields['add'] - opis poszczegolnych pol, ktore posiadaja wartosci dla kluczy:
		//	$aField['add' | 'drop']['name'] - nazwa atrybutu (obowiazkowo: string)
		//	$aField['add']['type'] - typ atrybutu (obowiazkowo: string)
		//	$aField['add']['not_null'] - ustawienie ograniczenia integralnosciowego not_null (nieobowiazkowe: true | false)
		//  $aField['add']['default'] - ustawienie domyslnej wartosci (nieobowiazkowe: string)
		//  $aField['add']['auto_increment'] - automatyczne zwiekszanie (nieobowiazkowe: true | false)
		//	$aField['add']['unique'] - wartosc unikalna (nieobowiazkowe: true | false)
		//  $aField['add']['comment'] - ustawia komentarz do atrybutu (nieobowiazkowe: string)
		//	$aField['add']['primary_key'] - ustawienie klucza podstawowego (nieobowiazkowe: true | false)
		//$aTabOptions - opcje tabeli (wszystkie opcjonalne), ktore posiadaja wartosci dla kluczy takie, jak w CTable::Create()
		function UpdateTable( $szTabName, $aFields=array(), $aTabOptions=array() ) {
			$szSql = 'alter table '.$szTabName.' ';
			
			if( isset($aFields['drop']) && !empty($aFields['drop']) ) {
			//wyrzucanie kolumn
				foreach( $aFields['drop'] as &$aDrop ) {
					if ( isset($aDrop['name']) ) {
						$szSql .= 'drop column '.$aDrop['name'];
					}
					
					$szSql .= ', ';
				}
			}
			
			if( isset($aFields['add']) && !empty($aFields['add']) ) {
			//dodawanie kolumn
				foreach( $aFields['add'] as &$aAdd ) {
					if ( isset($aAdd['name']) && !empty($aAdd['name']) && isset($aAdd['type']) && !empty($aAdd['type']) ) {
						$szSql .= 'add column '.$aAdd['name'].' '.$aAdd['type'].' ';
					}
					
					if ( isset($aAdd['not_null']) && $aAdd['not_null'] == true) {
						$szSql .= ' NOT NULL ';
					}
					
					if ( isset($aAdd['default']) && !empty($aAdd['default']) ) {
						$szSql .= ' DEFAULT '.$aAdd['defualt'].' ';
					}
					
					if ( isset($aAdd['auto_increment']) && $aAdd['auto_increment'] == true ) {
						$szSql .= ' AUTO_INCREMENT ';
					}
					
					if ( isset($aAdd['unique']) && $aAdd['unique'] == true ) {
						$szSql .= ' UNIQUE ';
					}
					
					if ( isset($aAdd['comment']) && !empty($aAdd['comment']) ) {
						$szSql .= ' COMMENT '.$aAdd['comment'].' ';
					}
					
					if ( isset($aAdd['primary_key']) && $aAdd['primary_key'] == true ) {
						$szSql .= ' PRIMARY KEY ';
					}
					
					$szSql .= ', ';
				}
				
			}
			
			if( isset($aTabOptions) ) {
			//update opcji tabeli
				foreach( $aTabOptions as &$aTabOpt ) {
					if ( isset($aTabOpt['engine']) && !empty($aTabOpt['engine']) ) {
						$szSql .= ' ENGINE = '.$aTabOpt['engine'].' ';
					}
					
					if ( isset($aTabOpt['auto_increment']) && is_numeric($aTabOpt['auto_increment']) ) {
						$szSql .= ' AUTO_INCREMENT = '.$aTabOpt['auto_increment'].' ';
					}
					
					if ( isset($aTabOpt['default_character']) && !empty($aTabOpt['default_character']) ) {
						$szSql .= ' DEFAULT CHARACTER SET = '.$aTabOpt['default_character'].' ';
					}
					
					if ( isset($aTabOpt['default_collate']) && !empty($aTabOpt['default_collocate']) ) {
						$szSql .= ' DEFAULT COLLATE = '.$aTabOpt['default_collate'].' ';
					}
					
					if ( isset($aTabOpt['comment']) && !empty($aTabOpt['comment']) ) {
						$szSql .= ' COMMENT = '.$aTabOpt['comment'].' ';
					}
					
					$szSql .= ', ';
				}
			}
			
			$szSql = rtrim($szSql, ', ');
			
			//laczy sie z baza i wykonuje zapytanie
			$hDbms = CDbms::GetInstance();
			$hDbms->ConnectDsn($this->m_szDsn);
			$hDbms->Query($szSql);
		}
		
		function OnError()
		{
			
		}

    }
?>
